/**
 * 营销方案生成系统 - 状态管理
 * 功能：管理需求数据、生成的方案数据等应用状态
 */
import { defineStore } from 'pinia'
import { ref } from 'vue'

// 需求数据接口 - 8字段表单结构
interface RequirementData {
  id?: string // 后端返回的需求ID
  core_goal: string // 核心目标（必填）
  target_audience: string // 目标受众（必填）
  budget_per_person: string // 人均预算（必填）
  focus_point: string // 方案侧重点（必填）
  gift_preference?: string // 礼品类型偏好（选填）
  specific_product?: string // 具体产品（选填）
  customer_preference: string // 客户偏好（必填）
  customer_pain_points: string // 客户痛点（必填）
  created_at?: string // 创建时间
  updated_at?: string // 更新时间
}

// 营销方案接口
interface MarketingPlan {
  sections: Array<{
    title: string
    content: string
  }>
  generatedAt: string
}

// PPT数据接口
interface PPTData {
  title: string
  theme: string
  slides: Array<{
    title: string
    summary: string
    content: string
  }>
  generatedAt: string
}

export const useMarketingStore = defineStore('marketing', () => {
  // 状态数据
  const requirementData = ref<RequirementData | null>(null)
  const generatedPlan = ref<MarketingPlan | null>(null)
  const generatedPPT = ref<PPTData | null>(null)
  const isLoading = ref(false)
  const error = ref<string | null>(null)

  // 设置需求数据
  const setRequirementData = (data: RequirementData) => {
    requirementData.value = data
    // 清除之前的生成结果
    generatedPlan.value = null
    generatedPPT.value = null
    error.value = null
  }

  // 获取需求数据
  const getRequirementData = (): RequirementData | null => {
    return requirementData.value
  }

  // 设置生成的营销方案
  const setGeneratedPlan = (plan: MarketingPlan) => {
    generatedPlan.value = {
      ...plan,
      generatedAt: new Date().toISOString()
    }
    error.value = null
  }

  // 获取生成的营销方案
  const getGeneratedPlan = (): MarketingPlan | null => {
    return generatedPlan.value
  }

  // 设置生成的PPT
  const setGeneratedPPT = (ppt: PPTData) => {
    generatedPPT.value = {
      ...ppt,
      generatedAt: new Date().toISOString()
    }
    error.value = null
  }

  // 获取生成的PPT
  const getGeneratedPPT = (): PPTData | null => {
    return generatedPPT.value
  }

  // 设置加载状态
  const setLoading = (loading: boolean) => {
    isLoading.value = loading
  }

  // 设置错误信息
  const setError = (errorMessage: string | null) => {
    error.value = errorMessage
  }

  // 清除所有数据
  const clearAll = () => {
    requirementData.value = null
    generatedPlan.value = null
    generatedPPT.value = null
    isLoading.value = false
    error.value = null
  }

  // 检查是否有完整的工作流数据
  const hasCompleteWorkflow = (): boolean => {
    return !!(requirementData.value && generatedPlan.value)
  }

  // 获取工作流进度
  const getWorkflowProgress = (): {
    step: number
    stepName: string
    completed: boolean
  } => {
    if (!requirementData.value) {
      return { step: 1, stepName: '填写需求', completed: false }
    }
    if (!generatedPlan.value) {
      return { step: 2, stepName: '生成方案', completed: false }
    }
    if (!generatedPPT.value) {
      return { step: 3, stepName: '生成PPT', completed: false }
    }
    return { step: 4, stepName: '完成', completed: true }
  }

  // 导出数据（用于持久化存储）
  const exportData = () => {
    return {
      requirementData: requirementData.value,
      generatedPlan: generatedPlan.value,
      generatedPPT: generatedPPT.value,
      exportedAt: new Date().toISOString()
    }
  }

  // 导入数据（用于恢复状态）
  const importData = (data: any) => {
    if (data.requirementData) {
      requirementData.value = data.requirementData
    }
    if (data.generatedPlan) {
      generatedPlan.value = data.generatedPlan
    }
    if (data.generatedPPT) {
      generatedPPT.value = data.generatedPPT
    }
    error.value = null
  }

  // 返回store的公共接口
  return {
    // 状态
    requirementData,
    generatedPlan,
    generatedPPT,
    isLoading,
    error,
    
    // 方法
    setRequirementData,
    getRequirementData,
    setGeneratedPlan,
    getGeneratedPlan,
    setGeneratedPPT,
    getGeneratedPPT,
    setLoading,
    setError,
    clearAll,
    hasCompleteWorkflow,
    getWorkflowProgress,
    exportData,
    importData
  }
})

// 导出类型定义
export type { RequirementData, MarketingPlan, PPTData }